use std::{env,path::PathBuf} ;

use crate::expand_path ;

pub struct Xdg ;


/// xgd是一个路径解析助手
impl Xdg{
    pub fn config_dir() -> PathBuf{
        if let Some(p) = env::var_os("JIZI_CONFIG_HOME").map(expand_path).filter(|p| p.is_absolute()) {
            return p ;
        }
        #[cfg(unix)]
        {
            env::var_os("XDG_CONFIG_HOME")
            .map(PathBuf::from)
            .filter(|p| p.is_absolute())
            .or_else(|| dirs::home_dir().map(|h| h.join(".config")))
            .expect("Failed to get config directory" )
        }
    }


    // 获取应用程序的状态目录
    pub fn state_dir() -> PathBuf {
        #[cfg(unix)]
        {
            env::var_os("XDG_STATE_HOME")  // 首先尝试读取环境变量
                .map(PathBuf::from)
                .filter(|p| p.is_absolute())
                .or_else(|| dirs::home_dir().map(|h| h.join(".local/state")))// 如果环境变量未设置或者不是绝对路径  那么会使用.local/state目录
                .map(|p| p.join("jizi"))
                .expect("Failed to get state directory")
        }
    }
    // 缓存目录
    #[inline]
    pub fn cache_dir() -> PathBuf {
        #[cfg(unix)]
        let s = {
            use uzers :: Users ;
            format!("jizi-{}" , jizi_shared::USERS_CACHE.get_current_uid())
        };
        env::temp_dir().join(s) 
    }
}

#[cfg(test)]
mod tests {
    use std::io;
    use super::* ;
    #[test]
    fn test_config_dir() {
        let dir = Xdg::config_dir();
        println!("{:?}", dir);
    }
    #[test]
    fn test_state_dir()  {
        let dir = Xdg::state_dir();
        println!("{:?}", dir);
    }
    #[test]
    fn test_cache_dir() {
        let dir = Xdg::cache_dir();
        println!("{:?}", dir);
    }
}